#include "interpreter.h"

ostream &operator<<(ostream &os, Procedure v)
{
    if (v.type == "Var")
    {
        os << v.type << ": " << v.expr << endl;
        return os;
    }
    else if (v.type == "Func")
    {
        os << v.type << "(";
        bool a = false;
        for (auto i : v.formals)
        {
            a = true;
            os << i << ", ";
        }
        os << (a ? "\b\b):" : "):") << v.expr << endl;
        return os;
    }
    else if (v.type == "None")
    {
        os << endl;
        return os;
    }
    else
    {
        throw "Unkown Type: " + v.type;
    }
}

string Procedure::_expr() { return expr; }
vector<string> Procedure::_formals() { return formals; }
bool Procedure::typeIs(string a) { return type == a; }
Frame *Procedure::makeCallFrame(vector<Procedure*> args)
{
    return this->env->makeChild(this->formals, args);
}